package com.nbcio.cd.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.nbcio.cd.domain.CdPermission;
import com.nbcio.cd.domain.vo.CdPermissionVo;

import java.util.List;

/**
 * 云网盘权限管理Service接口
 *
 * @author nbacheng
 * @date 2024-01-01
 */
public interface ICdPermissionService extends IService<CdPermission> {

    /**
     * 查询云网盘权限列表
     *
     * @param cdPermission 云网盘权限
     * @return 云网盘权限集合
     */
    List<CdPermissionVo> selectCdPermissionList(CdPermission cdPermission);

    /**
     * 新增云网盘权限
     *
     * @param cdPermission 云网盘权限
     * @return 结果
     */
    int insertCdPermission(CdPermission cdPermission);

    /**
     * 修改云网盘权限
     *
     * @param cdPermission 云网盘权限
     * @return 结果
     */
    int updateCdPermission(CdPermission cdPermission);

    /**
     * 批量删除云网盘权限
     *
     * @param permissionIds 需要删除的云网盘权限主键集合
     * @return 结果
     */
    int deleteCdPermissionByPermissionIds(Long[] permissionIds);

    /**
     * 删除云网盘权限信息
     *
     * @param permissionId 云网盘权限主键
     * @return 结果
     */
    int deleteCdPermissionByPermissionId(Long permissionId);

    /**
     * 检查用户对资源的权限
     *
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param permissionType 权限类型
     * @return 是否有权限
     */
    boolean checkUserPermission(Long userId, String resourceType, Long resourceId, String permissionType);

    /**
     * 检查角色对资源的权限
     *
     * @param roleId 角色ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param permissionType 权限类型
     * @return 是否有权限
     */
    boolean checkRolePermission(Long roleId, String resourceType, Long resourceId, String permissionType);

    /**
     * 获取用户对资源的所有权限
     *
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 权限列表
     */
    List<String> getUserPermissions(Long userId, String resourceType, Long resourceId);

    /**
     * 获取角色对资源的所有权限
     *
     * @param roleId 角色ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 权限列表
     */
    List<String> getRolePermissions(Long roleId, String resourceType, Long resourceId);

    /**
     * 为用户授权
     *
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param permissionTypes 权限类型列表
     * @return 结果
     */
    int grantUserPermission(Long userId, String resourceType, Long resourceId, List<String> permissionTypes);

    /**
     * 为角色授权
     *
     * @param roleId 角色ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param permissionTypes 权限类型列表
     * @return 结果
     */
    int grantRolePermission(Long roleId, String resourceType, Long resourceId, List<String> permissionTypes);

    /**
     * 撤销用户权限
     *
     * @param userId 用户ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param permissionTypes 权限类型列表
     * @return 结果
     */
    int revokeUserPermission(Long userId, String resourceType, Long resourceId, List<String> permissionTypes);

    /**
     * 撤销角色权限
     *
     * @param roleId 角色ID
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @param permissionTypes 权限类型列表
     * @return 结果
     */
    int revokeRolePermission(Long roleId, String resourceType, Long resourceId, List<String> permissionTypes);

    /**
     * 获取资源的权限列表
     *
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return 权限列表
     */
    List<CdPermissionVo> getResourcePermissions(String resourceType, Long resourceId);

    /**
     * 复制权限
     *
     * @param sourceResourceType 源资源类型
     * @param sourceResourceId 源资源ID
     * @param targetResourceType 目标资源类型
     * @param targetResourceId 目标资源ID
     * @return 结果
     */
    int copyPermissions(String sourceResourceType, Long sourceResourceId, 
                       String targetResourceType, Long targetResourceId);

    /**
     * 清理无效权限
     *
     * @return 清理的权限数量
     */
    int cleanInvalidPermissions();
}
